From a3681698900fc9585c2b20b74d8e08898aea4397 Mon Sep 17 00:00:00 2001 From: robertl Date: Thu, 6 Aug 2009 12:58:02 +0000 Subject: [PATCH] MTK improvements. Improve Holux GR245 detection, better handling for abrupt device power-down, adds erase_only option. --- mtk_logger.c | 81 ++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 57 insertions(+), 24 deletions(-) diff --git a/mtk_logger.c b/mtk_logger.c index f7a1889e4..4b29bf0f5 100644 --- a/mtk_logger.c +++ b/mtk_logger.c @@ -56,6 +56,7 @@ #include "gbser.h" #include "gbfile.h" /* used for csv output */ #include +#include #define MYNAME "mtk_logger" @@ -143,7 +144,7 @@ struct log_type { int id; int size; const char *name; -} log_type[] = { +} log_type[32] = { { 0, 4, "UTC" }, { 1, 2, "VALID" }, { 2, 8, "LATITUDE,N/S"}, @@ -163,7 +164,8 @@ struct log_type { { 16, 2, "SNR"}, { 17, 2, "RCR"}, { 18, 2, "MILLISECOND"}, - { 19, 8, "DISTANCE" } + { 19, 8, "DISTANCE" }, + { 20, 0, NULL}, }; struct sat_info { @@ -215,6 +217,7 @@ static void *fd; /* serial fd */ static FILE *fl; /* bin.file fd */ static char *port; /* serial port name */ static char *OPT_erase; /* erase ? command option */ +static char *OPT_erase_only; /* erase_only ? command option */ static char *OPT_log_enable; /* enable ? command option */ static char *csv_file; /* csv ? command option */ static enum MTK_DEVICE_TYPE mtk_device = MTK_LOGGER; @@ -245,6 +248,8 @@ static int mtk_parse_info(const unsigned char *data, int dataLen); static arglist_t mtk_sargs[] = { { "erase", &OPT_erase, "Erase device data after download", "0", ARGTYPE_BOOL, ARG_NOMINMAX }, + { "erase_only", &OPT_erase_only, "Only erase device data, do not download anything", + "0", ARGTYPE_BOOL, ARG_NOMINMAX }, { "log_enable", &OPT_log_enable, "Enable logging after download", "0", ARGTYPE_BOOL, ARG_NOMINMAX }, { "csv", &csv_file, "MTK compatible CSV output file", @@ -377,10 +382,11 @@ static void mtk_rd_init(const char *fname){ int rc; port = xstrdup(fname); - + + errno = 0; dbg(1, "Opening port %s...\n", fname); if ( (fd = gbser_init(port)) == NULL ) { - fatal(MYNAME ": Can't initialise port \"%s\"\n", port); + fatal(MYNAME ": Can't initialise port \"%s\" (%s)\n", port, strerror(errno)); } // verify that we have a MTK based logger... @@ -463,6 +469,12 @@ static void mtk_read(void){ FILE *dout; char *fusage = NULL; + + if ( *OPT_erase_only != '0' ) { + mtk_erase(); + return; + } + log_enabled = 0; init_scan = 0; dout = fopen(TEMP_DATA_BIN, "r+b"); @@ -616,7 +628,15 @@ mtk_retry: len = 0; } } - } + } else if ( strncmp(line, "$PMTK001,182,7,", 15) == 0 ){ // Command ACK + if ( line[15] != '3' ) { + // fixme - we should timeout here when no log data has been received... + dbg(2, "\nLog req. failed (%c)\n", line[15]); + gb_sleep(10*1000); + retry_cnt++; + goto mtk_retry; + } + } } } while ( len != 0 ); if ( init_scan ){ @@ -627,7 +647,7 @@ mtk_retry: } } else { addr += bsize; - if ( global_opts.verbose_status || global_opts.debug_level >= 2 ){ + if ( global_opts.verbose_status || (global_opts.debug_level >= 2 && global_opts.debug_level < 5) ){ int perc; perc = 100 - 100*(addr_max-addr)/addr_max; if ( addr >= addr_max ) @@ -638,7 +658,7 @@ mtk_retry: } if ( dout != NULL ) fclose(dout); - if ( global_opts.verbose_status || global_opts.debug_level >= 2 ) + if ( global_opts.verbose_status || (global_opts.debug_level >= 2 && global_opts.debug_level < 5) ) fprintf(stderr,"\n"); // Fixme - Order or. Enable - parse - erase ?? @@ -1087,10 +1107,15 @@ int mtk_parse(unsigned char *data, int dataLen, unsigned int bmask){ } /* for (bmap,...) */ if ( mtk_device == MTK_LOGGER ){ // Holux skips '*' checksum separator - if ( data[i] == '*' ) + if ( data[i] == '*' ){ i++; // skip '*' separator - else - dbg(1,"Missing '*' !\n"); + } else { + dbg(1,"Missing '*' !\n"); + if ( data[i] == 0xff ){ // in some case star-crc hasn't been written on power off. + dbg(1, "Bad data point @0x%.6x - skip %d bytes\n", (fl!=NULL)?ftell(fl):-1, i+2); + return i+2; // include '*' and crc + } + } } if ( memcmp(&data[0], &LOG_RST[0], 6) == 0 && memcmp(&data[12], &LOG_RST[12], 4) == 0 ) @@ -1193,11 +1218,20 @@ static int mtk_log_len(unsigned int bitmask){ int i, len; /* calculate the length of a binary log item. */ - len = 2; // add '*' + crc, holux would only be +1, oh, well... + switch ( mtk_device ){ + case HOLUX_M241: + case HOLUX_GR245: + len = 1; // add crc + break; + case MTK_LOGGER: + default: + len = 2; // add '*' + crc + break; + } for (i=0;i<32;i++){ if ( (1< DISTANCE ) - fprintf(stderr, "WARNING: Unknown size/meaning of bit %d\n", i); + warning(MYNAME ": Unknown size/meaning of bit %d\n", i); if ( (i == SID || i == ELEVATION || i == AZIMUTH || i == SNR) && (1< or HOLUXGR245WAYPNT - if ( memcmp(&buf[i+16], " ", 4) == 0 ) // Assume loglen >= 20... + // m241 - HOLUXGR241LOGGER or HOLUXGR241WAYPNT + // gr245 - HOLUXGR245LOGGER or HOLUXGR245WAYPNT + if ( memcmp(&buf[i+16], " ", 4) == 0 ){ // Assume loglen >= 20... + if ( mtk_device != HOLUX_GR245 ){ + dbg(2, "Detected Holux GR245 !\n"); + holux245_init(); + } k += 4; + } } else if ( buf[i] == 0xff && buf[i+1] == 0xff && buf[i+2] == 0xff && buf[i+3] == 0xff - /* && (pos + 2*logLen) & 0xffff) < logLen */) + /* && ((pos + 2*mtk_info.logLen) & 0xffff) < mtk_info.logLen */ ) { /* End of 64k block segment -- realign to next data area */ -- 2.30.2